# ============================================================================
# GPU性能测试 - 关闭调试输出 (100x100=10000单元)
# ============================================================================

wipe
puts "=========================================="
puts "GPU性能测试 (无调试输出)"
puts "网格规模: 100x100 = 10000 Quad单元"
puts "=========================================="

model basic -ndm 2 -ndf 2

# ============================================================================
# 网格参数
# ============================================================================

set nx 100;  # X方向单元数
set ny 100;  # Y方向单元数
set Lx 5.0;  # X方向总长度 (m)
set Ly 5.0;  # Y方向总长度 (m)

set dx [expr $Lx / $nx]
set dy [expr $Ly / $ny]

puts "网格尺寸: ${Lx}m x ${Ly}m"
puts "单元尺寸: [format "%.3f" $dx]m x [format "%.3f" $dy]m"

# ============================================================================
# 材料定义
# ============================================================================

nDMaterial PlasticDamageConcrete3d 1 30.0e9 0.2 3.0e6 30.0e6 0.6 0.5 2.0 0.75

# ============================================================================
# 创建节点
# ============================================================================

puts "创建节点..."
set nodeTag 1
for {set j 0} {$j <= $ny} {incr j} {
    for {set i 0} {$i <= $nx} {incr i} {
        set x [expr $i * $dx]
        set y [expr $j * $dy]
        node $nodeTag $x $y
        incr nodeTag
    }
}
set numNodes [expr ($nx+1) * ($ny+1)]
puts "总节点数: $numNodes"

# ============================================================================
# 创建单元
# ============================================================================

puts "创建单元..."
set thickness 0.2
set eleTag 1
for {set j 0} {$j < $ny} {incr j} {
    for {set i 0} {$i < $nx} {incr i} {
        set n1 [expr $j * ($nx+1) + $i + 1]
        set n2 [expr $n1 + 1]
        set n3 [expr $n1 + ($nx+1) + 1]
        set n4 [expr $n1 + ($nx+1)]
        element quad $eleTag $n1 $n2 $n3 $n4 $thickness "PlaneStress" 1
        incr eleTag
    }
}
set numElements [expr $nx * $ny]
puts "总单元数: $numElements"

# ============================================================================
# 边界条件
# ============================================================================

# 底部固定
for {set i 1} {$i <= [expr $nx+1]} {incr i} {
    fix $i 1 1
}

# 侧边X固定
for {set j 1} {$j < $ny} {incr j} {
    set leftNode [expr $j * ($nx+1) + 1]
    set rightNode [expr $leftNode + $nx]
    fix $leftNode 1 0
    fix $rightNode 1 0
}

# 顶部X固定
set topRowStart [expr $ny * ($nx+1) + 1]
for {set i 0} {$i <= $nx} {incr i} {
    set nodeId [expr $topRowStart + $i]
    fix $nodeId 1 0
}

# ============================================================================
# 载荷
# ============================================================================

set totalLoad -50.0e3
set nodeLoad [expr $totalLoad / ($nx + 1)]

pattern Plain 1 Linear {
    for {set i 0} {$i <= $nx} {incr i} {
        set nodeId [expr $topRowStart + $i]
        load $nodeId 0.0 $nodeLoad
    }
}

puts "施加载荷: [expr -$totalLoad/1000] kN"

# ============================================================================
# GPU求解器配置 (关键：debugLevel 0)
# ============================================================================

puts "\n=========================================="
puts "配置GPU求解器 (debugLevel=0, 无调试输出)"
puts "=========================================="

constraints Plain
numberer Plain
system GPUSolver -debugLevel 0 -enableModule all
test NormDispIncr 1.0e-6 20
algorithm Newton
integrator LoadControl 0.1

analysis Static

# ============================================================================
# 性能测试
# ============================================================================

puts "\n开始GPU分析 (10步)..."
set startTime [clock milliseconds]

set numSteps 10
set ok 0

for {set i 1} {$i <= $numSteps} {incr i} {
    set stepStart [clock milliseconds]
    set ok [analyze 1]
    set stepEnd [clock milliseconds]
    set stepTime [expr $stepEnd - $stepStart]

    if {$ok != 0} {
        puts "❌ 分析失败于步 $i"
        break
    }

    puts "  Step $i/$numSteps - 耗时: ${stepTime} ms"
}

set endTime [clock milliseconds]
set totalTime [expr $endTime - $startTime]

# ============================================================================
# 结果输出
# ============================================================================

puts "\n=========================================="
puts "GPU性能测试结果 (无调试)"
puts "=========================================="
puts "网格规模: ${nx}x${ny} = $numElements 单元"
puts "分析步数: $numSteps"
puts "总时间: $totalTime ms"

if {$ok == 0} {
    set avgTime [expr $totalTime / double($numSteps)]
    puts "平均时间/步: [format "%.2f" $avgTime] ms"

    # 关键节点位移
    set centerTopNode [expr $topRowStart + $nx/2]
    set dispY [nodeDisp $centerTopNode 2]
    puts "\n中心顶部节点位移: [format "%.6e" $dispY] m"
    puts "\n✓ 分析成功"
} else {
    puts "\n❌ 分析失败"
}

puts "=========================================="

# 保存结果
set outFile [open "gpu_no_debug_results.txt" w]
puts $outFile "=== GPU性能测试 (无调试输出) ==="
puts $outFile "网格: ${nx}x${ny} = $numElements 单元"
puts $outFile "总时间: $totalTime ms"
if {$ok == 0} {
    puts $outFile "平均时间/步: [format "%.2f" [expr $totalTime / double($numSteps)]] ms"
    puts $outFile "成功: 是"
} else {
    puts $outFile "成功: 否"
}
close $outFile

wipe
